package com.atguigu.srb.core.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.atguigu.srb.core.pojo.vo.DictExcelVO;
import com.atguigu.srb.core.service.DictService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

//@Service //容器对象传参
public class DictExcelVoListener extends AnalysisEventListener<DictExcelVO> {
    //自动装配属性所在的对象必须也在容器中
//    @Resource
    DictService dictService;
    //若容器中没有dictService对象，还可以使用构造器传参来接收dictService
    public DictExcelVoListener(DictService dictService) {
        this.dictService = dictService;
    }

    private List<DictExcelVO> dictExcelVOS = new ArrayList<>();
    private int limit = 100;
    @Override
    public void invoke(DictExcelVO data, AnalysisContext context) {

        dictExcelVOS.add(data);
        /*
            问题：
            1.批量保存 需要的参数类型为Dict
            2.如果数据库已经存在excel中的某个数据字典则不保存
         */
        if (dictExcelVOS.size() == limit) {
            List<Dict> dicts = convertExcelVosToDicts();
            //保存到数据库
            dictService.saveBatch(dicts);
            dictExcelVOS.clear(); //清空集合，重新开始接收数据
        }
    }

    //抽取的转换excelVo集合为dict集合的工具方法
    private List<Dict> convertExcelVosToDicts() {
        return dictExcelVOS.stream().map(dictExcelVO -> { //将dictExcelVO对象转换为dict对象
            Dict dict = new Dict();
            //将源对象 相同的属性名和数据类型的 属性值 拷贝给目标对象 两个类型必须有相应的get和set方法
            BeanUtils.copyProperties(dictExcelVO, dict);
            return dict;
        }).filter(dict -> {//筛选dict对象，如果数据库已存在该对象过滤掉
            //如果id已存在 不保存
            return dictService.count(Wrappers.lambdaQuery(Dict.class)
                    .eq(Dict::getId, dict.getId())) == 0;//如果id查询不到则数据保留，查询到了则排除
        }).collect(Collectors.toList());
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if (dictExcelVOS.size() > 0) {
            List<Dict> dicts = convertExcelVosToDicts();
            //保存到数据库
            dictService.saveBatch(dicts);
            dictExcelVOS.clear(); //清空集合，重新开始接收数据
        }
    }
}
